'''
题：您需要编写一个程序，按升序对（名称，年龄，高度）元组进行排序，其中name是字符串，age和height是数字。 元组由控制台输入。 排序标准是：
1：根据名称排序;
2：然后根据年龄排序;
3：然后按分数排序。
优先级是name> age>得分。
如果给出以下元组作为程序的输入：
Tom,19,80
John,20,90
Jony,17,91
Jony,17,93
Json,21,85
然后，程序的输出应该是：
[（'John'，'20'，'90'），（'Jony'，'17'，'91'），（'Jony'，'17'，'93'），（'Json'，'21 '，'85'），（'Tom'，'19'，'80'）]
'''

#方法1：使用普通的模式进行输入与输出或者一次性的输入之后通过tuple(list索引操作来生成数据)
# allinfor = []
# for _ in range(1,6):
#     inf = input("输入个人的信息(名称，年龄，高度):").split(",")
#     allinfor.append(tuple(inf))
# print(allinfor)
# from operator import itemgetter
# infor = [('John', '20', '90'), ('Jonv', '17', '91'),
#          ('Jonv', '17', '93'), ('Json', '21', '85'),
#          ('Tom', '19', '80')]
# print(sorted(infor,key=itemgetter(0,1),reverse=False))

#方法2：使用类来定义之后使用attergetter
# class Student:
#     def __init__(self,name,age,height):
#         self.name = name
#         self.age = age
#         self.height = height
#
#     def getinfo(self):
#         return (self.name,self.age,self.height)
#
# L = [Student("John",20,90).getinfo(),Student("Johv",17,91).getinfo(),
#      Student("Jonv", 17, 93).getinfo(),Student("Json",21,85).getinfo(),
#      Student("Tom", 19, 80).getinfo()]
# print(sorted(L,key=lambda x:(x[0],x[1]),reverse=False))

#方法3 使用attrgetter来操作
from operator import attrgetter
class Student:
    def __init__(self,name,age,height):
        self.name = name
        self.age = age
        self.height = height

    def __repr__(self):
        '''
        __repr__() 会返回和调用者有关的 “类名+object at+内存地址”信息。
        当然，我们还可以通过在类中重写这个方法，从而实现当输出实例化对象时，输出我们想要的信息。
        '''
        return repr((self.name,self.age,self.height))

L = [Student("Tom", 19, 80),Student("John",20,90),Student("Johv",17,91),
     Student("Jonv", 17, 93),Student("Json",21,85),]
print(sorted(L,key=attrgetter("name","age"),reverse=False))
# 其等价于 sorted(L, key=lambda o: (o.name,o.age))